package br.fatec.model.dao;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.MateriaPrima;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;
import br.fatec.util.Validacoes;

public class MateriaPrimaDao {
	
	private Persistencia persis;
	
	public MateriaPrimaDao()
	{
		Globals globals = Globals.getInstance();
		
		this.persis = globals.getPersistencia();
	}
	
	public void cadastrar(MateriaPrima materiaPrima) throws Exception
	{	
		persis.cadastrar(materiaPrima);
	}
	
	public void alterar(MateriaPrima materiaPrima) throws Exception
	{
		persis.alterar(materiaPrima);
	}
	
	public void excluir(MateriaPrima materiaPrima) throws Exception
	{
		persis.excluir(materiaPrima.getClass(), materiaPrima.getCodigo());
	}
	
	public void desativar(MateriaPrima materiaPrima) throws Exception {
		materiaPrima = consultar(materiaPrima.getCodigo());
		
		materiaPrima.setAtivo(false);
		
		persis.alterar(materiaPrima);
	}
	
	public MateriaPrima consultar(Integer codigo) throws Exception
	{		
		String query = "select * from materia_prima where codigo = :codigo and ativo = :ativo"; 
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);
		
		return (MateriaPrima)persis.consultar(MateriaPrima.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<MateriaPrima> listar() throws Exception
	{
		String query = "select * from materia_prima where ativo = :ativo order by codigo asc"; 
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<MateriaPrima>)persis.listar(MateriaPrima.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<MateriaPrima> listar(String nome) throws Exception
	{
		String query = "select distinct materia_prima.codigo, materia_prima.ativo, materia_prima.criado_em, materia_prima.descricao, materia_prima.nome, materia_prima.unidade_medida, materia_prima.valor_unitario, materia_prima.veiculo, materia_prima.criado_por, materia_prima.estoque from materia_prima";
		query += " left join sinonimo on sinonimo.materia_prima = materia_prima.codigo";
		query += " where (sinonimo.nome ilike :nome or materia_prima.nome ilike :nome) and materia_prima.ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nome+"%");
		parametros.put("ativo", true);
		
		return (List<MateriaPrima>)persis.listar(MateriaPrima.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<MateriaPrima> listarVeiculos() throws Exception {
		String query = "select * from materia_prima where ativo = :ativo and veiculo = :veiculo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("veiculo", true);
		parametros.put("ativo", true);

		return (List<MateriaPrima>) persis.listar(MateriaPrima.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<MateriaPrima> listarVeiculos(String nome) throws Exception {
		String query = "select distinct materia_prima.codigo, materia_prima.ativo, materia_prima.criado_em, materia_prima.descricao, materia_prima.nome, materia_prima.unidade_medida, materia_prima.valor_unitario, materia_prima.veiculo, materia_prima.criado_por, materia_prima.estoque from materia_prima";
		query += " left join sinonimo on sinonimo.materia_prima = materia_prima.codigo";
		query += " where (sinonimo.nome ilike :nome or materia_prima.nome ilike :nome) and materia_prima.ativo = :ativo and materia_prima.veiculo = :veiculo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nome+"%");
		parametros.put("ativo", true);
		parametros.put("veiculo", true);

		return (List<MateriaPrima>) persis.listar(MateriaPrima.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<MateriaPrima> filtrar(String codigo, String nome, String valorUnitario, MateriaPrima.UnidadeMedida unidadeMedida) throws Exception {
		String query = "select distinct materia_prima.codigo, materia_prima.ativo, materia_prima.criado_em, materia_prima.descricao, materia_prima.nome, materia_prima.unidade_medida, materia_prima.valor_unitario, materia_prima.veiculo, materia_prima.criado_por, materia_prima.estoque from materia_prima";
		query += " left join sinonimo on sinonimo.materia_prima = materia_prima.codigo";
		query += " where materia_prima.ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);

		if (nome != null && !nome.isEmpty())
		{
			query += " and (sinonimo.nome ilike :nome or materia_prima.nome ilike :nome)";
			parametros.put("nome", "%" +nome+"%");
		}
		
		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(materia_prima.codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%" +codigo+"%");
		}
		
		if (valorUnitario != null && !valorUnitario.isEmpty())
		{
			if(Validacoes.isNumeric(valorUnitario.replace(",", ".")))
			{
				valorUnitario = new DecimalFormat("0.00").format(Double.parseDouble(valorUnitario.replace(",", ".")));
			}
			
			query += " and cast(materia_prima.valor_unitario as varchar(50)) ilike :valor_unitario";
			parametros.put("valor_unitario", "%" +valorUnitario.replace(",", ".")+"%");
		}
		
		if (unidadeMedida != null)
		{
			query += " and materia_prima.unidade_medida = :unidade_medida";
			parametros.put("unidade_medida", unidadeMedida.ordinal());
		}
		
		query +=  " order by materia_prima.codigo asc";
		
		return (List<MateriaPrima>) persis.listar(MateriaPrima.class, query, parametros);
	}
}
